超详细的热图绘制教程(5000余字),真正的保姆级教程
生物信息学习的正确姿势
NGS系列文章包括NGS基础、高颜值在线绘图和分析、转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这)、ChIP-seq分析 (ChIP-seq基本分析流程)、单细胞测序分析 (重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程)、DNA甲基化分析、重测序分析、GEO数据挖掘(典型医学设计实验GEO数据分析 (step-by-step))、批次效应处理等内容。
以下文章原始来源于蚂蚁生信 ,作者蚂蚁生信
直接来源R语言统计与绘图,函数解释来自医科堂。
经常会想到用热图来展示某个基因或某些基因的表达量问题,今天用R中的pheatmap
包一步步绘制热图。
如果不想写代码,在线版可以满足大部分需求,高颜值免费在线绘图工具升级版来了~~~
系统学习R见 送书《R语言数据分析和可视化》 | 这个为生信学习和生信作图打造的开源R教程真香!!!
目 录
1. 绘图前准备
1.1 设置工作目录
1.2 安装和加载R包
1.3 读取查看数据
2. 绘制热图
3. 自定义热图
3.1 热图横向标准化
3.2 图形外观调整
3.3 去除横纵坐标标签
3.4 修改图例
3.5 设置字体
3.6 调整横纵向聚类
3.7 调整分组标签角度
3.8 添加图形标题
3.9 调整热块大小
3.10 划分聚类热图区块
3.11 调整热图显示数值
3.12 标记热图区块
4. 构建分组信息
4.1 构建纵向分组信息
4.2 构建横向分组信息
4.3 共同组合二者
5. 保存图形
6. pheatmap()函数解释
1. 绘图前准备
1.1 设置工作目录
首先清除环境变量,设置工作目录,工作目录是R用来读取文件和保存结果的默认目录。
我一般是在C盘新建一个文件夹当做R的工作目录,所有的文件都复制到这里面处理。
rm(list=ls()) # 清除环境变量
setwd("C:/Rdata") # 设置工作目录
getwd() # 查看当前的工作目录
# [1] "C:/Rdata"
1.2 安装和加载R包
安装我们绘图需要用的包,如果已安装,直接加载就好了。
install.packages("pheatmap") # 安装包
install.packages("ggplot2") # 安装包
library(pheatmap) # 加载包
library(ggplot2) # 加载包
1.3 读取查看数据
演示数据不是内置数据集,如需要演示数据,请后台回复热图
即可免费获取。
data <- read.table("test.FPKM.txt", # 读取的数据文件名称,这里文件是放在工作目录下
header=T, # 数据集第一行为变量名
row.names=1, # 第一列为行名
sep="\t") # 指定分隔符号
dim(data) # 查看变量有多少行多少列
#[1] 21 9
head(data) # 查看数据集前六行
2. 绘制热图
先绘制个基本款的热图。
p <- pheatmap(data)
3. 自定义热图
3.1 热图横向标准化
设置标准化方向scale
,对其横向标准化。
p <- pheatmap(data, scale="row")
3.2 图形外观调整
设置边框为白色,去掉横向、纵向聚类。
p <- pheatmap(data, scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F)
3.3 去除横纵坐标标签
去掉横纵坐标中的id。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = F, #去掉横、纵坐标id
show_colnames = F)
3.4 修改图例
3.4.1 不显示右上角图例
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = F, #去掉横、纵坐标id
show_colnames = F,
legend = F) # 去掉图例
3.4.2 设置图例范围
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = F, #去掉横、纵坐标id
show_colnames = F,
legend = T, # 添加图例
legend_breaks=c(-1,0,1)) # 设置图例范围
# 也可以设置legend_breaks=c(-2,0,2)试试
3.5 设置字体
3.5.1 设置图形字体大小
设置图中字的大小,使用fondsize参数来设置。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = T, #显示横、纵坐标id
show_colnames = T,
legend = F, # 去掉图例
fontsize = 8) # 设置字体大小
# 也可以设置其他大小试试。
3.5.2 分别指定横纵字体大小
分别指定横向和纵向字体大小,使用fontsize_row
和fontsize_col
参数设置。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = T, #显示横、纵坐标id
show_colnames = T,
legend = T, # 显示图例
fontsize_row = 12, # 分别设置横向和纵向字体大小
fontsize_col = 16)
3.6 调整横纵向聚类
3.6.1 调整横纵向聚类树高
分别设置横向纵向的树高,使用treeheight_col
和treeheight_row
参数设置。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = T, # 显示横向、纵向聚类
cluster_rows = T,
treeheight_col = 50, # 分别设置横、纵向聚类树高
treeheight_row = 45)
3.6.2 调整聚类距离类型
设置聚类的距离类型,使用clustering_distance_rows
参数指定,分为如下几类:correlation,euclidean,maximum,manhattan,canberra,binary,minkowski
。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = T, # 显示横向、纵向聚类
cluster_rows = T,
clustering_distance_rows = "correlation", # 设置聚类的距离类型
treeheight_col = 50, # 分别设置横、纵向聚类树高
treeheight_row = 45)
3.6.3 调整聚类方法
调整聚类的方法,使用clustering_method
参数指定,可选有'ward', 'ward.D', 'ward.D2', 'single', 'complete', 'average', 'mcquitty', 'median' or 'centroid'.
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = T, # 显示横向、纵向聚类
cluster_rows = T,
clustering_distance_rows = "euclidean", # 设置聚类的距离类型
clustering_method="single", # 设置聚类方法
treeheight_col = 50, # 分别设置横、纵向聚类树高
treeheight_row = 45)
3.7 调整分组标签角度
设置分组标签的角度,可以使用参数angle_col
指定,可选有270、0、45、90、315等。
p <- pheatmap(data,scale="row",
angle_col = 45, # 设置显示角度
clustering_distance_rows = "minkowski",
clustering_method="complete",
border="white",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.8 添加图形标题
给图形增加标题,可以使用main
参数指定。
p <- pheatmap(data, scale="row", border="white",
main="Gene1", # 设置图形标题
angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.9 调整热块大小
分别调整热图方块宽度和高度,可以使用cellwidth
和cellheight
参数指定。
p <- pheatmap(data, scale="row", border="white",
cellwidth = 40,cellheight = 20, # 设置热图方块宽度和高度
main="Gene1", angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.10 划分聚类热图区块
根据热图聚类对其进行区块儿划分,可以使用cutree_cols
和cutree_rows
参数指定
p <- pheatmap(data,scale="row",
cutree_cols = 6, cutree_rows =5, # 列划为6块,行为5块
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",border="white",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
注:此处我去掉了热图块儿的大小;cellwidth = 8,cellheight = 6
在上图基础上增加边缘线。
p <- pheatmap(data,scale="row", border="#8B0A50",
cutree_cols = 6, cutree_rows =5,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.11 调整热图显示数值
热图上是否展示数值,大小和颜色,大小以及数值展示类型,可以使用display_numbers
、fontsize_number
、number_color
、number_format
等参数设置。
3.11.1 热图上显示数值
使用display_numbers
参数指定是否显示数值。
p <- pheatmap(data,scale="row",border="#8B0A50",
display_numbers = T, # 热图上显示数值
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.11.2 设置显示数值的大小
使用fontsize_number
参数指定数值的显示大小。
p <- pheatmap(data,scale="row",border="#8B0A50",
fontsize_number = 10, display_numbers = T,
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.11.3 设置数值的颜色
使用number_color
参数指定数值的颜色。
p <- pheatmap(data,scale="row",border="#8B0A50",
number_color="red",
fontsize_number = 10,display_numbers = T,
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.11.4 设置数值显示类型
使用number_format参数指定数值显示类型,下图显示为科学计数法。
p <- pheatmap(data,scale="row", border="#8B0A50", number_color="red",
number_format="%.2e",
fontsize_number = 10,display_numbers = T,
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.12 标记热图区块
对热图方块儿进行标记;display_numbers
,如果该值大于1,则为+,否则为-。
p <- pheatmap(data,scale="row",
number_color="red",number_format="%.2e",
border="#8B0A50",
fontsize_number = 16,
display_numbers = matrix(ifelse(data > 1, "+", "-"), nrow(data)),
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
# 也可以设置display_numbers = matrix(ifelse(data > 2, "++", "-"), nrow(data))试试
4. 构建分组信息
构建纵向和横向分组信息(有3个处理,分别是:盐、干旱和热应激);以及时间:0-3day,对3类基因21个基因进行分组,分别是:"WRKY", "AP2", "YABBY"。
4.1 构建纵向分组信息
annotation_col = data.frame(Deal_with = factor(rep(c("Salt", "Drought","Heat"), 3)),
Day=factor(rep(c("Day1", "Day2","Day3"), 3)))
rownames(annotation_col)
# [1] "1" "2" "3" "4" "5" "6" "7" "8" "9"
colnames(data)
# [1] "Q1" "Q2" "Q3" "F1" "F2" "F3" "T1" "T2" "T3"
rownames(annotation_col) <- colnames(data)
head(annotation_col)
# Deal_with Day
# Q1 Salt Day1
# Q2 Drought Day2
# Q3 Heat Day3
# F1 Salt Day1
# F2 Drought Day2
# F3 Heat Day3
pheatmap(data, annotation_col = annotation_col)
p <- pheatmap(data, scale="row",
annotation_col = annotation_col,
number_color="red",number_format="%.2e",
border="#8B0A50",fontsize_number = 8,
display_numbers = matrix(ifelse(data > 2, "++", "-"), nrow(data)),
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
4.2 构建横向分组信息
annotation_row = data.frame(GeneClass = factor(rep(c("WRKY", "AP2", "YABBY"),7)))
rownames(annotation_row) <- rownames(data)
head(annotation_row)
# GeneClass
# Gene1 WRKY
# Gene2 AP2
# Gene3 YABBY
# Gene4 WRKY
# Gene5 AP2
# Gene6 YABBY
pheatmap(data, annotation_row =annotation_row)
p <- pheatmap(data, scale="row",
number_color="red",
annotation_row =annotation_row,
number_format="%.2e",
border="#8B0A50",
fontsize_number = 16,
display_numbers = matrix(ifelse(data > 2, "++", "-"), nrow(data)),
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
4.3 共同组合二者
p <- pheatmap(data,
annotation_col = annotation_col,
annotation_row = annotation_row)
p <- pheatmap(data,scale="row",
number_color="red",
annotation_col = annotation_col,
annotation_row = annotation_row,
number_format="%.2e",border="#8B0A50",
fontsize_number = 15,
display_numbers = matrix(ifelse(data > 2, "++", "-"),nrow(data)),
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
5. 保存图形
可以保存为pdf/jpeg/png格式,建议保存为pdf/jpeg,因为二者清晰度高。
p <- pheatmap(data,
annotation_col = annotation_col,
annotation_row = annotation_row,
filename = "基因家族热图.pdf",
width = 10, height = 8)
p <- pheatmap(data,
annotation_col = annotation_col,
annotation_row = annotation_row,
filename = "基因家族热图.jpeg",
width = 10,height = 8)
p <- pheatmap(data,
annotation_col = annotation_col,
annotation_row = annotation_row,
filename = "基因家族热图.png",
width = 10,height = 8)
6. pheatmap()函数
pheatmap(mat, color = colorRampPalette(rev(brewer.pal(n = 7, name =
"RdYlBu")))(100), kmeans_k = NA, breaks = NA, border_color = "grey60",
cellwidth = NA, cellheight = NA, scale = "none", cluster_rows = TRUE,
cluster_cols = TRUE, clustering_distance_rows = "euclidean",
clustering_distance_cols = "euclidean", clustering_method = "complete",
clustering_callback = identity2, cutree_rows = NA, cutree_cols = NA,
treeheight_row = ifelse((class(cluster_rows) == "hclust") || cluster_rows,
50, 0), treeheight_col = ifelse((class(cluster_cols) == "hclust") ||
cluster_cols, 50, 0), legend = TRUE, legend_breaks = NA,
legend_labels = NA, annotation_row = NA, annotation_col = NA,
annotation = NA, annotation_colors = NA, annotation_legend = TRUE,
annotation_names_row = TRUE, annotation_names_col = TRUE,
drop_levels = TRUE, show_rownames = T, show_colnames = T, main = NA,
fontsize = 10, fontsize_row = fontsize, fontsize_col = fontsize,
angle_col = c("270", "0", "45", "90", "315"), display_numbers = F,
number_format = "%.2f", number_color = "grey30", fontsize_number = 0.8
* fontsize, gaps_row = NULL, gaps_col = NULL, labels_row = NULL,
labels_col = NULL, filename = NA, width = NA, height = NA,
silent = FALSE, na_col = "#DDDDDD", ...)
## 函数解释
mat # 需要绘制热图的数字矩阵。
color # 表示颜色,赋值渐变颜色调色板colorRampPalette属性,选择"蓝,白,红"渐变,分为100个等级
# 例 color = colorRampPalette(c("navy", "white", "red"))(100)
kmeans_k # 绘制热图的行聚类数,如果是NA,那么行不会聚类。
breaks # 设置mat数值范围的数字序列
border_color # 表示热图上单元格边框的颜色,如果不绘制边框,则使用NA
cellwidth # 表示每个单元格的宽度,若选择NA则表示适应窗口
cellheight # 表示每个单元格的高度,若选择NA则表示适应窗口
scale # 表示值均一化的方向,或者按照行或列,或者没有,值可以是"row", “column” 或者"none"
cluster_rows # 表示进行行的聚类,值可以是FALSE或TRUE
cluster_cols # 表示进行列的聚类,值可以是FALSE或TRUE
clustering_distance_rows # 表示行距离度量的方法
clustering_distance_cols # 表示列距离度量的方法
clustering_method # 表示聚类方法,值可以是hclust的任何一种,
# 如"ward.D",“single”, “complete”, “average”, “mcquitty”, “median”, “centroid”, “ward.D2”
clustering_callback # 回调函数来修改聚类
cutree_rows # 基于层次聚类(使用cutree)划分行的簇数(如果未聚集行,则忽略参数)
cutree_cols # 基于层次聚类(使用cutree)划分列的簇数(如果未聚集行,则忽略参数)
treeheight_row # 行的树的高度,
treeheight_col # 列的树的高度
legend # TRUE或者FALSE,表示是否显示图例
legend_breaks # 设置图例的断点,如legend_breaks = -1:4
legend_labels # legend_breaks对应的标签例:legend_breaks = -1:4, legend_labels = c(“0”,“1e-4”, “1e-3”, “1e-2”, “1e-1”, “1”)
annotation_row # 行的分组信息,需要使用相应的行名称来匹配数据和注释中的行,注意之后颜色设置会考虑离散值还是连续值,格式要求为数据框
annotation_col # 列的分组信息,需要使用相应的列名称来匹配数据和注释中的列,格式要求为数据框
annotation_colors # 用于手动指定annotation_row和annotation_col track颜色的列表。
annotation_legend # 是否显示图例的名称。
annotation_names_row # 是否显示行注释的名称。
annotation_names_col # 是否显示列注释的名称。
show_rownames # 是否显示行名
show_colnames # 是否显示列名
main # 图的名字
fontsize # 图的字体大小
fontsize_row # 行名的字体大小,默认与图的字体大小相同
fontsize_col # 列名的字体大小,默认与图的字体大小相同
angle_col # 列标签的角度,可选择 (0, 45, 90, 270 and 315)
display_numbers # 表示是否将数值显示在热图的格子中,如果这是一个矩阵(与原始矩阵具有相同的尺寸),则显示矩阵的内容而不是原始值。
number_format # 设置显示数值的格式,较常用的有"%.2f"(保留小数点后两位),"%.1e"(科学计数法显示,保留小数点后一位)
number_color # 设置显示内容的颜色
fontsize_number # 设置显示内容的字体大小
labels_row # 代替行名的自定义标签
labels_col # 代替列名的自定义标签
filename # 图片保存位置以及文件名
width # 手动设置输出文件的宽度(单位:英寸)
height # 手动设置输出文件的高度(单位:英寸)
silent # 不绘制热图
na_col # 缺失值的颜色
本文完。
如果觉得不错,记得分享、点赞、点在看哦!
本文转载自蚂蚁生信,函数解释复制自医科堂。
往期精品(点击图片直达文字对应教程)
后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集